from rest_framework import serializers
from apps.users.models import User
import re


class UserSerializer(serializers.ModelSerializer):
    # 显示指明字段
    # password2 = serializers.CharField(max_length=20, min_length=8, write_only=True)

    class Meta:
        # 指定模型类
        model = User
        # 指定字段
        fields = ('id', 'username', 'mobile', 'email', 'password')
        # 密码字段只参与反序列化,同时密码的长度需要限定
        extra_kwargs = {
            'password': {
                'max_length': 20,
                'min_length': 8,
                'write_only': True
            },
        }

    # 密码一致性验证 手机格式  说明邮箱生成的是邮箱字段EmailField 会自动验证邮箱格式

    def validate(self, attrs):
        # 验证手机
        if not re.match(r'1[3-9]\d{9}', attrs['mobile']):
            raise serializers.ValidationError('手机格式不正确')

        # # 验证密码
        # if attrs['password'] != attrs['password2']:
        #     raise serializers.ValidationError('密码不一致')

        return attrs

    def create(self, validated_data):
        # 保存业务 缺少密码加密  保存还是调用父类的保存，子类增加一个密码加密的业务
        # 父类的保存业务
        user = super().create(validated_data)
        # 密码加密
        user.set_password(validated_data['password'])
        # 区分用户身份 是保存管理员还是保存普通用户 通过判断请求路径，管理员保存的请求路径为 /permission/admins/  普通用户保存的请求路径为/users/
        # 获取请求路径  request.path    在序列化器中如何获取request？
        # self下有一个context的属性里面保存了request对象  context是字典数据
        request = self.context['request']
        if request.path == '/meiduo_admin/permission/admins/':
            user.is_staff = True
        user.save()
        return user
